/**
 * @file raftRpcUtil.cpp
 * @brief Raft RPC 工具类实现
 * 
 * 封装了 Raft 协议中的 RPC 调用功能
 * 提供 AppendEntries、InstallSnapshot、RequestVote 等 RPC 接口
 * 负责与其他 Raft 节点进行网络通信
 */
#include "raftRpcUtil.h"

#include <mprpcchannel.h>
#include <mprpcccontroller.h>

// AppendEntries - 发送日志追加 RPC 请求
// 用于 Leader 向 Follower 发送心跳或日志条目
// 参数: args - 请求参数，response - 响应结果
// 返回: true 表示 RPC 调用成功，false 表示失败
bool RaftRpcUtil::AppendEntries(raftRpcProctoc::AppendEntriesArgs *args, raftRpcProctoc::AppendEntriesReply *response) {
  MprpcController controller;  // RPC 控制器
  stub_->AppendEntries(&controller, args, response, nullptr);  // 发起 RPC 调用
  return !controller.Failed();  // 返回调用是否成功
}

// InstallSnapshot - 发送快照安装 RPC 请求
// 用于 Leader 向落后的 Follower 发送快照数据
// 参数: args - 快照请求参数，response - 响应结果
// 返回: true 表示 RPC 调用成功，false 表示失败
bool RaftRpcUtil::InstallSnapshot(raftRpcProctoc::InstallSnapshotRequest *args,
                                  raftRpcProctoc::InstallSnapshotResponse *response) {
  MprpcController controller;  // RPC 控制器
  stub_->InstallSnapshot(&controller, args, response, nullptr);  // 发起 RPC 调用
  return !controller.Failed();  // 返回调用是否成功
}

// RequestVote - 发送投票请求 RPC
// 用于候选者向其他节点请求投票
// 参数: args - 投票请求参数，response - 响应结果
// 返回: true 表示 RPC 调用成功，false 表示失败
bool RaftRpcUtil::RequestVote(raftRpcProctoc::RequestVoteArgs *args, raftRpcProctoc::RequestVoteReply *response) {
  MprpcController controller;  // RPC 控制器
  stub_->RequestVote(&controller, args, response, nullptr);  // 发起 RPC 调用
  return !controller.Failed();  // 返回调用是否成功
}

//先开启服务器，再尝试连接其他的节点，中间给一个间隔时间，等待其他的rpc服务器节点启动

// RaftRpcUtil 构造函数 - 初始化 RPC 客户端
// 创建与指定 IP 和端口的 RPC 连接
// 参数: ip - 目标节点 IP 地址，port - 目标节点端口号
RaftRpcUtil::RaftRpcUtil(std::string ip, short port) {
  //*********************************************  */
  //发送rpc设置
  // 创建 RPC 存根，用于发起远程调用
  stub_ = new raftRpcProctoc::raftRpc_Stub(new MprpcChannel(ip, port, true));
}

// RaftRpcUtil 析构函数 - 清理资源
// 释放 RPC 存根占用的内存
RaftRpcUtil::~RaftRpcUtil() { 
  delete stub_;  // 删除 RPC 存根
}
